package com.gking.centerSystem.utils.commonUtil;


import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

/**
 * 密码强度检测工具类
 * 要求：至少6位，包含字母、数字、标点符号三种字符类型
 */
public class PasswordValidatorUtil {

    // 密码最小长度
    private static final int MIN_LENGTH = 6;

    // 字符类型定义
    private static final String LETTERS = "a-zA-Z";
    private static final String DIGITS = "0-9";
    private static final String PUNCTUATION = "!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?";

    // 正则表达式模式
    private static final Pattern LETTER_PATTERN = Pattern.compile(".*[" + LETTERS + "].*");
    private static final Pattern DIGIT_PATTERN = Pattern.compile(".*[" + DIGITS + "].*");
    private static final Pattern PUNCTUATION_PATTERN = Pattern.compile(".*[" + PUNCTUATION + "].*");

    /**
     * 验证密码强度
     *
     * @param password 待验证的密码
     * @return 验证结果对象
     */
    public static ValidationResult validatePassword(String password) {
        ValidationResult result = new ValidationResult();

        if (password == null || password.trim().isEmpty()) {
            result.setValid(false);
            result.addMessage("密码不能为空");
            return result;
        }

        // 检查长度
        if (password.length() < MIN_LENGTH) {
            result.setValid(false);
            result.addMessage(String.format("密码长度至少需要%d位", MIN_LENGTH));
        }

        // 检查是否包含字母
        if (!LETTER_PATTERN.matcher(password).matches()) {
            result.setValid(false);
            result.addMessage("密码必须包含至少一个字母");
        }

        // 检查是否包含数字
        if (!DIGIT_PATTERN.matcher(password).matches()) {
            result.setValid(false);
            result.addMessage("密码必须包含至少一个数字");
        }

        // 检查是否包含标点符号
        if (!PUNCTUATION_PATTERN.matcher(password).matches()) {
            result.setValid(false);
            result.addMessage("密码必须包含至少一个标点符号");
        }

        // 如果没有错误信息，则密码有效
        if (result.isValid()) {
            result.addMessage("密码强度符合要求");
        }

        return result;
    }


    /**
     * 验证结果封装类
     */
    @Getter
    public static class ValidationResult {
        @Setter
        private boolean valid = true;

        private final List<String> messages = new ArrayList<>();

        public void addMessage(String message) {
            this.messages.add(message);
        }
    }

}